<?php

/**
 * класс для работы с таблице пользователей
 *
 * @author kingop
 */
class DatabaseObject_User extends DatabaseObject {

    public $categories = null;
    public $shop = null;
    public $country = null;
    public $region = null;
    public $city = null;
    public static $userTypes = array(
        'member' => 'Пользователь',
        'shop' => 'Пользователь',
        'admin' => 'Администратор',
        'seo' => 'SEO',
        'globaladmin' => 'Главный администратор'
    );
    public $_newPassword = null;

    public function __construct($db) {
        parent::__construct($db, 'users', 'id');

        // далее перечислены все поля в таблице
        $this->add('login');
        $this->add('password');
        $this->add('country_id');
        $this->add('region_id');
        $this->add('city_id');
        $this->add('first_name');
        $this->add('phone');
        $this->add('nameshop');
        $this->add('currency');
        $this->add('content');
        $this->add('email');
        $this->add('gender');
        $this->add('photo');
        $this->add('reg_ip');
        $this->add('ban');
        $this->add('hash');
        $this->add('ban');
        $this->add('isApproved');
         $this->add('isCreateProduct');
        $this->add('type');
        $this->add('date_reg');
        $this->add('date_last');
        $this->add('custom_phones');
        $this->add('from_sn');
    }

    public function preInsert() {
        parent::preInsert();

        $this->date_reg = date("Y-m-d H:i:s");
        $this->currency = 1;
        $this->isCreateProduct = 0;
        $this->hash = self::createHash($this->login, $this->first_name, $this->surname);
        
        return true;
    }

    public function postInsert() {
        parent::postInsert();


        return true;
    }

    protected function postLoad() {
        parent::postLoad();
        $temp = CustomControllerAction::getCountryCity($this->country_id, $this->city_id);
        //  CustomControllerAction::pre($temp);
        if ($temp){
        $this->country = $temp[0]['country']['title'];
        $this->city = $temp[0]['city']['title'];
        $this->region = $temp[0]['region']['title'];
        
        }
        if ($this->nameshop) {
            $shop = new DatabaseObject_Shop($this->getDb());
            $shop->load($this->getId(), 'userId');
            $this->shop = $shop;
        }
        return true;
    }

    // функция залогинивания (а точнее, запись в сессию данных пользователя)
    public function createAuthIdentity() {
        $identity = new stdClass;
        $identity->id = $this->getId();
        $identity->login = $this->login;
        $identity->type = $this->type;
        $identity->first_name = $this->first_name;
        $identity->nameshop = $this->nameshop;
        $identity->email = $this->email;
        $identity->currency = $this->currency;


        return $identity;
    }

    // проверка логина на занятость
    public function usernameExists($login) {
        $query = sprintf('select count(*) as num from %s where login = ?', $this->_table);

        $result = $this->_db->fetchOne($query, $login);

        return $result > 0;
    }

    // проверка email на занятость
    public function emailExists($email) {
        $query = sprintf('select count(*) as num from %s where email = ?', $this->_table);

        $result = $this->_db->fetchOne($query, $email);

        return $result > 0;
    }

    // проверка модерации аккаунта
    public static function IsApproved($db, $login) {
        $user = new DatabaseObject_User($db);
        if (!$user->load($login, 'login') || $user->isApproved)
            return true;

        return false;
    }
    
      // проверка модерации аккаунта
    public  function IsApprovedMail($db, $login) {
        $user = new DatabaseObject_User($db);
        $user->load($login, 'login');
        if ($user->email=='') return '2';
        if ($user->isApproved)
            return '0';

        return '1';
    }

    // генерация пароля
    public function fetchPassword() {
        if (!$this->isSaved())
            return false;

        // сгенерируем новый пароль
        $this->_newPassword = time();
        $this->password = $this->_newPassword;

        // сохраним пользователя и отправим уведомление по email
        $this->save();
        $mail_subject = $this->login . ", Восстановление пароля";
        $mail_text = "
            Доброго времени суток! " . $this->login . ",

            Вы запросили изменение забытого пароля.

            Ваши данные для входа:

                Логин: " . $this->login . "
                Новый пароль: " . $this->_newPassword . "

            C уважением,

            Администрация.
        ";
        mail($this->email, $mail_subject, $mail_text);

        return true;
    }

    // проверка корректности логина
    static public function IsValidUsername($login) {
        $validator = new Zend_Validate_Alnum();
        return $validator->isValid($login);
    }

    public function __set($name, $value) {
        switch ($name) {
            case 'password':
                $value = md5($value);
                break;

            case 'type':
                if (!array_key_exists($value, self::$userTypes))
                    $value = 'member';
                break;
        }

        return parent::__set($name, $value);
    }

    // получение списка пользователей
    public static function GetUsers($db, $options = array(), $filter = array()) {
        // инициализация параметров
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'u.login'
        );
        $filters = array(
            'isApproved' => 2,
            'country_id' => 0,
            'nameshop' => '0'
        );

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        foreach ($filters as $k => $v) {
            $filter[$k] = array_key_exists($k, $filter) ? $filter[$k] : $v;
        }

        $select = self::_GetBaseQuery($db, $options);

        // задаим поля. которые хотим получить
        $select->from(null, 'u.*');

        // другие параметры
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);
        /*if ($options['where'] > 0)
            $select->where($options['where']);*/
        // фильтр пользователей
        if ($filter['isApproved'] != '' && ($filter['isApproved'] == 1 || $filter['isApproved'] == 0))
            $select->where('isApproved = ?', $filter['isApproved']);
        if ($filter['country_id'] != 0)
            $select->where('country_id = ?', $filter['country_id']);
        if ($filter['nameshop'] == 'yes')
            $select->where("nameshop != ''");
        if ($filter['nameshop'] == 'no')
            $select->where("nameshop = ''");

        $select->order($options['order']);

        // получим данные
        $data = $db->fetchAll($select);

        // преобразуем данные в объекты класса
        $users = parent::BuildMultiple($db, __CLASS__, $data);

        // вернем массив пользователей
        return $users;
    }

    // получение количества пользователей
    public static function GetUsersCount($db, $options = array(), $filter = array()) {
        $filters = array(
            'isApproved' => 2,
            'country_id' => 0,
            'nameshop' => '0'
        );
        $select = self::_GetBaseQuery($db, $options);
        $select->from(null, 'count(*)');


        foreach ($filters as $k => $v) {
            $filter[$k] = array_key_exists($k, $filter) ? $filter[$k] : $v;
        }
        if ($filter['isApproved'] != '' && ($filter['isApproved'] == 1 || $filter['isApproved'] == 0))
            $select->where('isApproved = ?', $filter['isApproved']);
        if ($filter['country_id'] != 0)
            $select->where('country_id = ?', $filter['country_id']);
        if ($filter['nameshop'] == 'yes')
            $select->where("nameshop != ''");
        if ($filter['nameshop'] == 'no')
            $select->where("nameshop = ''");

        return $db->fetchOne($select);
    }

    // уведомление админов по емейлу о новой регистрации
    public static function SendAdminRegNotification($db, $id) {
        // напишу позже :)
    }

    private static function _GetBaseQuery($db, $options) {
        // инициализируем параметры
        $defaults = array('id' => array());

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        // создадим запрос
        $select = $db->select();
        $select->from(array('u' => 'users'), array());

        if (isset($options['where'])) {
            $select->where($options['where']);
        }
        if (isset($options['limit'])) {
            $select->limit($options['offset'] . ',' . $options['limit']);
        }


        // отфильтруем записи по id (если задано)
        if (count($options['id']) > 0)
            $select->where('u.id in (?)', $options['id']);

        return $select;
    }

    public function sendEmail($tpl) {
        $templater = new Templater();
        $templater->user = $this;

        // сформируем тело письма
        $body = $templater->render('email/' . $tpl);

        // тему письма возьмем из первой строчки шаблона
        list($subject, $body) = preg_split('/\r|\n/', $body, 2);

        // далее настройка и отправка
        $mail = new Zend_Mail();

        // укажем адрес и логин пользователя в поле "Кому"
        $mail->addTo($this->email, trim($this->login));

        // получим админские настройки "От кого"
        $mail->setFrom(Zend_Registry::get('config')->email->from->email, Zend_Registry::get('config')->email->from->name);

        // зададим тело письма и отправим
        $mail->setSubject(trim($subject));
        $mail->setBodyText(trim($body));
        $mail->send();
    }

    protected function preDelete() {
        parent::preDelete();
        // удалим заявки
      //  DatabaseObject_Requests::DeleteUserRequests($this->getDb(), $this->getId());
        // удалим категории
     //   DatabaseObject_UsersCats::DeleteUserCats($this->getDb(), $this->getId());

        return true;
    }

  

    // получение пользоватея по имени магазина 
    public static function GetUsersShop($db, $name) {
        $select = self::_GetBaseQuery($db, array());
        $select->from(null, 'u.*');
        $select->where('nameshop = ?', $name);
        $data = $db->fetchAssoc($select);
        return $data; //$users = parent::BuildMultiple($db, __CLASS__, $data);
    }

    public static function createHash($id, $name, $surname) {
        return md5($id . $name . $surname);
    }

    public function GetCurrencyUser($db, $id) {

        $query = sprintf("select currency from users where id = '$id'");

        $result = $db->fetchOne($query);

        return $result;
    }

        // получение списка пользователей
    public static function GetSearchUsers($db, $options = array(), $filter = array()) {
        // инициализация параметров
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'u.id'
        );
        $filters = array(
            'isApproved' => 1,
            'country_id' => 0,
            'city_id' => 0,
            'nameshop' => '0'
        );

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        foreach ($filters as $k => $v) {
            $filter[$k] = array_key_exists($k, $filter) ? $filter[$k] : $v;
        }

        $select = self::_GetBaseQuery($db, $options);

        // задаим поля. которые хотим получить
        $select->from(null, 'u.*');

        // другие параметры
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);
        /*if ($options['where'] > 0)
            $select->where($options['where']);*/
        // фильтр пользователей
        if ($filter['isApproved'] != '' && ($filter['isApproved'] == 1 || $filter['isApproved'] == 0))
            $select->where('isApproved = ?', $filter['isApproved']);
        if ($filter['country_id'] != 0)
            $select->where('country_id = ?', $filter['country_id']);
        if ($filter['city_id'] != 0)
            $select->where('city_id IN ('. $filter['city_id'].')');
        if ($filter['nameshop'] != '0')
        {
             //$select->where("last_name LIKE '%$filter[nameshop]%'"); 
             $select->where("nameshop LIKE '%$filter[nameshop]%'"); 
           
             
        }
        else
        {
              $select->where("nameshop !=''"); 
        }

        $select->order($options['order']);
echo $select->__tostring();
        // получим данные
        $data = $db->fetchAll($select);

        // преобразуем данные в объекты класса
        $users = parent::BuildMultiple($db, __CLASS__, $data);

        // вернем массив пользователей
        return $users;
    }
    
    public static function SendNotificationEmail($db, $notification_type, $user_id) {
        // notification_type: {
        //      'new_pm' - новое личное сообщение
        //      'new_req' - новая заявка в друзья
        //      'acc_req' - одобрение заявки в друзья
        //      'new_com' - новый комментарий
        //      'new_order' - новый заказ
        // }
        
        $user = new DatabaseObject_User($db);
        $user->load($user_id);
        
        $config = DatabaseObject_Config::GetConfig($db);
        
        $emailTo = $user->email;
        $emailSubject = "";
        $emailText = "";
        
        $domain = Zend_Registry::get('config')->domain;
        
        switch($notification_type) {
            case 'new_pm':
                $emailSubject = $config['new_pm_notification_subject'];
                $emailText = $config['new_pm_notification_text'] 
                             . "<br /><br />"
                             . "<a href='http://" . $domain . "/account/messages'>Перейти к личным сообщениям</a>";
                break;
            case 'new_req':
                $emailSubject = $config['new_request_notification_subject'];
                $emailText = $config['new_request_notification_text'] 
                             . "<br /><br />"
                             . "<a href='http://" . $domain . "/account/requests'>Перейти к заявкам в друзья</a>";
                break;
            case 'acc_req':
                $emailSubject = $config['new_accept_request_notification_subject'];
                $emailText = $config['new_accept_request_notification_text'] 
                             . "<br /><br />"
                             . "<a href='http://" . $domain . "/account/friends'>Перейти к списку друзей</a>";
                break;
            case 'new_com':
                $emailSubject = $config['new_comment_notification_subject'];
                $emailText = $config['new_comment_notification_text'] 
                             . "<br /><br />"
                             . "<a href='http://" . $domain . "/account/reviews'>Перейти к отзывам</a>";
                break;
            case 'new_order':
                $emailSubject = $config['new_order_notification_subject'];
                $emailText = $config['new_order_notification_text'] 
                             . "<br /><br />"
                             . "<a href='http://" . $domain . "/account/sale'>Перейти к заказам</a>";
                break;
            case 'new_person_order':
                $emailSubject = $config['new_person_order_notification_subject'];
                $emailText = $config['new_person_order_notification_text'] 
                             . "<br /><br />"
                             . "<a href='http://" . $domain . "/account/myordersshop'>Перейти к персональным заказам</a>";
                break;
        }
        
        /* Для отправки HTML-почты вы можете установить шапку Content-type. */
        $headers= "MIME-Version: 1.0\r\n";
        $headers .= "Content-type: text/html; charset=utf-8\r\n";

        /* дополнительные шапки */
        $headers .= "From: Даба Handmade<notification@dabahm.com>\r\n";
        
        
        mail($emailTo, $emailSubject, $emailText, $headers);
    }
}

?>
